home *** CD-ROM | disk | FTP | other *** search
/ AMIGA-CD 2 / Amiga-CD - Volume 2.iso / ungepackte_daten / 1993 / 6 / 02 / dodec / source / dodec.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-06-01  |  11.1 KB  |  467 lines

  1. #include "dodec.h"
  2.  
  3. struct StdListNode {
  4.     struct Node StdNode;
  5.     unsigned char Bytes[4];
  6. };
  7.  
  8. unsigned char DebugFlag;
  9.  
  10. unsigned short Err;
  11.  
  12. struct List StdList;
  13.  
  14. extern void init_prng (unsigned long seed);
  15. extern unsigned char prng (void);
  16. extern unsigned char check_hl (unsigned long h, unsigned long l,
  17.     unsigned char *values);
  18. extern unsigned short mirror (unsigned short Word);
  19.  
  20. #pragma regcall (check_hl (d0, d1, a0))
  21. #pragma regcall (mirror (d1))
  22.  
  23. unsigned char *modtable;
  24. unsigned long prng_state[2];
  25.  
  26. struct Library *IntuitionBase, *GadToolsBase, *AslBase;
  27.  
  28. struct FileRequester *FileReq;
  29.  
  30. char SNameBuff[300], TNameBuff[300];
  31.  
  32. struct NewWindow NewWin = {
  33.     60, 30, 400, 119,
  34.     -1, -1,
  35.     IDCMP_CLOSEWINDOW | IDCMP_REFRESHWINDOW | IDCMP_GADGETDOWN | IDCMP_GADGETUP,
  36.     WFLG_DRAGBAR | WFLG_DEPTHGADGET | WFLG_CLOSEGADGET | WFLG_SIMPLE_REFRESH |
  37.         WFLG_ACTIVATE | WFLG_GIMMEZEROZERO,
  38.     0, 0, (unsigned char *)"DODec - Directory Opus 4.0 Decrypter",
  39.     NULL, NULL,
  40.     402, 118, 402, 118,
  41.     WBENCHSCREEN
  42. };
  43. struct Window *Win;
  44.  
  45. struct TextAttr TAttr = {
  46.     (unsigned char *)"topaz.font", 8, 0, 0
  47. };
  48.  
  49. struct NewGadget SourceGad = {
  50.     320,  5, 64, 12, (unsigned char *)"Quelle", &TAttr, 1, 0, NULL, NULL };
  51. struct NewGadget TargetGad = {
  52.     320, 19, 64, 12, (unsigned char *)"Ziel",   &TAttr, 2, 0, NULL, NULL };
  53. struct NewGadget StartGad = {
  54.     320, 33, 64, 12, (unsigned char *)"Start",  &TAttr, 3, 0, NULL, NULL };
  55. struct NewGadget StopGad = {
  56.     320, 47, 64, 12, (unsigned char *)"Stop",   &TAttr, 4, 0, NULL, NULL };
  57.  
  58. struct NewGadget Byte1Gad = {
  59.     255,  5, 48, 12, (unsigned char *)"#1:", &TAttr, 0, 0, NULL, NULL };
  60. struct NewGadget Byte2Gad = {
  61.     255, 19, 48, 12, (unsigned char *)"#2:", &TAttr, 0, 0, NULL, NULL };
  62. struct NewGadget Byte3Gad = {
  63.     255, 33, 48, 12, (unsigned char *)"#3:", &TAttr, 0, 0, NULL, NULL };
  64. struct NewGadget Byte4Gad = {
  65.     255, 47, 48, 12, (unsigned char *)"#4:", &TAttr, 0, 0, NULL, NULL };
  66.  
  67. struct NewGadget TypeGad = {
  68.     10, 5, 200, 58, NULL, &TAttr, 5, 0, NULL, NULL };
  69.  
  70. struct NewGadget SNameGad = {
  71.     80, 62, 304, 12, (unsigned char *)"Quelle:", &TAttr, 0, 0, NULL, NULL };
  72. struct NewGadget TNameGad = {
  73.     80, 76, 304, 12, (unsigned char *)"Ziel:",   &TAttr, 0, 0, NULL, NULL };
  74. struct NewGadget StatusGad = {
  75.     80, 90, 304, 12, (unsigned char *)"Status:", &TAttr, 0, 0, NULL, NULL };
  76.  
  77. struct TagItem NoTags[] = {
  78.     { TAG_END, 0 }
  79. };
  80.  
  81. struct TagItem IntTags[] = {
  82.     { GTIN_MaxChars, 3 },
  83.     { TAG_END, 0 }
  84. };
  85.  
  86. struct TagItem TextTags[] = {
  87.     { GTTX_Border, TRUE },
  88.     { TAG_END, 0 }
  89. };
  90.  
  91. struct PTagItem {
  92.     unsigned long pti_tag;
  93.     unsigned char *pti_pointer;
  94. };
  95.  
  96. struct PTagItem SourceTags[] = {
  97.     { ASLFR_TitleText, (unsigned char *)"Name der Quelldatei?" },
  98.     { TAG_END, 0 }
  99. };
  100.  
  101. struct PTagItem TargetTags[]= {
  102.     { ASLFR_TitleText, (unsigned char *)"Name der Zieldatei?" },
  103.     { TAG_END, 0 }
  104. };
  105.  
  106. struct PTagItem ListViewTags[] = {
  107.     { GTLV_Labels, (unsigned char *)&StdList },
  108.     { TAG_END, 0 }
  109. };
  110.  
  111. struct Gadget *GadList = NULL, *SName, *TName, *Status, *Byte[4];
  112.  
  113. struct GadEntry {
  114.     struct NewGadget *Point;
  115.     unsigned long Type;
  116.     struct TagItem *Tags;
  117.     struct Gadget **GAddr;
  118. } AllGadgets[] = {
  119.     { &SourceGad, BUTTON_KIND, NoTags, NULL },
  120.     { &TargetGad, BUTTON_KIND, NoTags, NULL },
  121.     { &StartGad, BUTTON_KIND, NoTags, NULL },
  122.     { &StopGad, BUTTON_KIND, NoTags, NULL },
  123.     { &Byte1Gad, INTEGER_KIND, IntTags, &Byte[0] },
  124.     { &Byte2Gad, INTEGER_KIND, IntTags, &Byte[1] },
  125.     { &Byte3Gad, INTEGER_KIND, IntTags, &Byte[2] },
  126.     { &Byte4Gad, INTEGER_KIND, IntTags, &Byte[3] },
  127.     { &TypeGad, LISTVIEW_KIND, (struct TagItem *)ListViewTags, NULL },
  128.     { &SNameGad, TEXT_KIND, TextTags, &SName },
  129.     { &TNameGad, TEXT_KIND, TextTags, &TName },
  130.     { &StatusGad, TEXT_KIND, TextTags, &Status },
  131.     { NULL, 0, NULL, NULL }
  132. };
  133.  
  134. unsigned char *VInfo;
  135.  
  136. void DeleteWindow (void)
  137. {
  138.     FreeVisualInfo (VInfo);
  139.     CloseWindow (Win);
  140.     FreeGadgets (GadList);
  141. }
  142.  
  143. short CreateWindow (void)
  144. {
  145.     struct GadEntry *CGad = AllGadgets;
  146.     struct Gadget *SGad;
  147.  
  148.     if (SGad = CreateContext (&GadList))
  149.         if (Win = OpenWindow (&NewWin))
  150.             if (VInfo = GetVisualInfoA (Win -> WScreen, NoTags)) {
  151.                 do {
  152.                     CGad -> Point -> ng_VisualInfo = VInfo;
  153.                     SGad = CreateGadgetA (CGad -> Type, SGad, CGad -> Point,
  154.                         CGad -> Tags);
  155.                     if (CGad -> GAddr)
  156.                         *(CGad -> GAddr) = SGad;
  157.                 } while ((++CGad) -> Point);
  158.                 AddGList (Win, GadList, 0L, -1L, NULL);
  159.                 RefreshGList (GadList, Win, NULL, -1L);
  160.                 GT_RefreshWindow (Win, NULL);
  161.                 return TRUE;
  162.             } else
  163.                 CloseWindow (Win);
  164.  
  165.     return FALSE;
  166. }
  167.  
  168. void SetStat (char *String)
  169. {
  170.     struct PTagItem DummyTag[] = {
  171.         { GTTX_Text, NULL },
  172.         { TAG_END, NULL }
  173.     };
  174.  
  175.     DummyTag -> pti_pointer = (unsigned char *)String;
  176.     GT_SetGadgetAttrsA (Status, Win, NULL, (struct TagItem *)DummyTag);
  177. }
  178.  
  179. void GetFile (struct TagItem *Tags, struct Gadget *UpGad, char *NameBuff)
  180. {
  181.     struct PTagItem DummyTag[] = {
  182.         { GTTX_Text, NULL },
  183.         { TAG_END, NULL }
  184.     };
  185.  
  186.     AslRequest (FileReq, Tags);
  187.     strncpy (NameBuff, (char *)FileReq -> fr_Drawer, 200);
  188.     AddPart ((unsigned char *)NameBuff, FileReq -> fr_File, 299);
  189.     DummyTag -> pti_pointer = (unsigned char *)NameBuff;
  190.     GT_SetGadgetAttrsA (UpGad, Win, NULL, (struct TagItem *)DummyTag);
  191. }
  192.  
  193. void ActSource (void)
  194. {
  195.     GetFile ((struct TagItem *)SourceTags, SName, SNameBuff);
  196. }
  197.  
  198. void ActTarget (void)
  199. {
  200.     GetFile ((struct TagItem *)TargetTags, TName, TNameBuff);
  201. }
  202.  
  203. void Decrypt (unsigned long Key)
  204. {
  205.     FILE *FHS, *FHT;
  206.     char Buff[400];
  207.     int c;
  208.  
  209.     SetStat ("Ich habe einen Schlüssel gefunden!");
  210.     sprintf (Buff, "%s.%.8x", TNameBuff, Key);
  211.     init_prng (Key);
  212.  
  213.     if (!(FHS = fopen (SNameBuff, "rb"))) {
  214.         SetStat ("Ich kann die Quelldatei nicht öffnen.");
  215.         Err++;
  216.     } else {
  217.         if (!(FHT = fopen (Buff, "wb"))) {
  218.             SetStat ("Ich kann die Zieldatei nicht öffnen.");
  219.             Err++;
  220.         } else {
  221.             while ((c = fgetc (FHS)) != EOF) {
  222.                 c -= prng ();
  223.                 if (fputc (c, FHT) == EOF) {
  224.                     SetStat ("Fehler beim Schreiben.");
  225.                     Err++;
  226.                     break;
  227.                 }
  228.             }
  229.             fclose (FHT);
  230.         }
  231.         fclose (FHS);
  232.     }
  233. }
  234.  
  235. short RefrOrAbort (void)
  236. {
  237.     struct IntuiMessage *IMsg;
  238.     short RetVal = 0;
  239.  
  240.     while (IMsg = GT_GetIMsg (Win -> UserPort)) {
  241.         switch (IMsg -> Class) {
  242.             case IDCMP_REFRESHWINDOW:
  243.                 GT_BeginRefresh (Win);
  244.                 GT_EndRefresh (Win, (unsigned long)TRUE);
  245.                 break;
  246.             case IDCMP_GADGETUP:
  247.                 if (((struct Gadget *)(IMsg -> IAddress)) -> GadgetID == 4)
  248.                     RetVal = 1;
  249.                 break;
  250.         }
  251.         GT_ReplyIMsg (IMsg);
  252.     }
  253.     return RetVal;
  254. }
  255.  
  256. void ActStart (void)
  257. {
  258.     unsigned long i, Hi, Lo, Keys = 0;
  259.     unsigned char Values[4];
  260.     char Buff[100];
  261.     FILE *FH;
  262.  
  263.     Err = 0;
  264.  
  265.     if (FH = fopen (SNameBuff, "rb")) {
  266.  
  267.         for (i = 0; i < 4; i++) {
  268.             Values[i] = fgetc (FH) - ((struct StringInfo *)(Byte[i] -> SpecialInfo))
  269.                 -> LongInt;
  270.         }
  271.         fclose (FH);
  272.  
  273.         for (i = 0; i < 65536; i++) {
  274.             sprintf (Buff, "Runde %5d, Anzahl: %d, Fehler: %d", i + 1, Keys, Err);
  275.             SetStat (Buff);
  276.             Lo = mirror ((unsigned short)i);
  277.  
  278.             if (RefrOrAbort ())
  279.                 break;
  280.  
  281.             for (Hi = 0; Hi < 65536; Hi++)
  282.                 if (check_hl (Hi, Lo, Values)) {
  283.                     Decrypt ((Hi << 16) | Lo);
  284.                     Keys++;
  285.                 }
  286.         }
  287.     SetStat ("Bereit.");
  288.     } else
  289.         SetStat ("Ich kann die Quelldatei nicht öffnen.");
  290. }
  291.  
  292. void (*GadFuncs[])(void) = {
  293.     ActSource, ActTarget, ActStart
  294. };
  295.  
  296. short HandleIMsg (struct IntuiMessage *IMsg)
  297. {
  298.     unsigned short GadNum;
  299.  
  300.     switch (IMsg -> Class) {
  301.         case IDCMP_REFRESHWINDOW:
  302.             GT_BeginRefresh (Win);
  303.             GT_EndRefresh (Win, (unsigned long)TRUE);
  304.             break;
  305.         case IDCMP_GADGETUP:
  306.             if (GadNum = ((struct Gadget *)(IMsg -> IAddress))
  307.                 -> GadgetID)
  308.                 if (GadNum < 4)
  309.                     (*GadFuncs[GadNum - 1])();
  310.                 else
  311.                     if (GadNum != 4) {
  312.                         struct TagItem Dummy[] = {
  313.                             { GTIN_Number, 0 }, { TAG_END, 0 } };
  314.                         unsigned short ListEl = IMsg -> Code;
  315.                         struct StdListNode *Scratch = (struct StdListNode *)
  316.                             StdList.lh_Head;
  317.  
  318.                         while (ListEl--)
  319.                             Scratch = (struct StdListNode *)
  320.                                 Scratch -> StdNode.ln_Succ;
  321.                         for (ListEl = 0; ListEl < 4; ListEl++) {
  322.                             Dummy -> ti_Data = Scratch -> Bytes[ListEl];
  323.                             GT_SetGadgetAttrsA (Byte[ListEl], Win, NULL, Dummy);
  324.                         }
  325.                     }
  326.             break;
  327.         case IDCMP_CLOSEWINDOW:
  328.             return (TRUE);
  329.         }
  330.  
  331.     return (FALSE);
  332. }
  333.  
  334. char *Clone (char *Src)
  335. {
  336.     char *Dest = 0;
  337.  
  338.     if (Dest = AllocMem (strlen (Src) + 1, MEMF_PUBLIC))
  339.         strcpy (Dest, Src);
  340.  
  341.     return Dest;
  342. }
  343.  
  344. short ReadDefaults (void)
  345. {
  346.     FILE *fh;
  347.     char NameBuff[80];
  348.     unsigned int Byte1, Byte2, Byte3, Byte4; 
  349.     struct StdListNode *NewNode;
  350.  
  351.     StdList.lh_Tail = NULL;
  352.     StdList.lh_Head = (struct Node *)&StdList.lh_Tail;
  353.     StdList.lh_TailPred = (struct Node *)&StdList.lh_Head;
  354.     StdList.lh_Type = NT_UNKNOWN;
  355.  
  356.     if (!(fh = fopen ("dodec.def", "r")))
  357.         if (!(fh = fopen ("s:dodec.def", "r")))
  358.             return 0;
  359.  
  360.     while (fscanf (fh, "%s %d %d %d %d\n", NameBuff, &Byte1, &Byte2,
  361.         &Byte3, &Byte4) != EOF) {
  362.         if (DebugFlag)
  363.             printf ("%s %d %d %d %d\n", NameBuff, Byte1, Byte2,
  364.                 Byte3, Byte4);
  365.         if (!(NewNode = AllocMem (sizeof (*NewNode), MEMF_PUBLIC)))
  366.             break;
  367.         else {
  368.             NewNode -> StdNode.ln_Pri = 0;
  369.             if (NewNode -> StdNode.ln_Name = Clone (NameBuff)) {
  370.                 NewNode -> StdNode.ln_Type = NT_UNKNOWN;
  371.                 NewNode -> Bytes[0] = Byte1;
  372.                 NewNode -> Bytes[1] = Byte2;
  373.                 NewNode -> Bytes[2] = Byte3;
  374.                 NewNode -> Bytes[3] = Byte4;
  375.                 AddTail (&StdList, (struct Node *)NewNode);
  376.             } else {
  377.                 FreeMem (NewNode, sizeof (*NewNode));
  378.                 break;
  379.             }
  380.         }
  381.     }
  382.  
  383.     fclose (fh);
  384.     return 1;
  385. }
  386.  
  387. void FreeDefaults (void)
  388. {
  389.     struct StdListNode *Scratch;
  390.  
  391.     while (Scratch = (struct StdListNode *)RemHead (&StdList)) {
  392.         FreeMem (Scratch -> StdNode.ln_Name,
  393.             strlen (Scratch -> StdNode.ln_Name) + 1);
  394.         FreeMem (Scratch, sizeof (*Scratch));
  395.     }    
  396. }
  397.  
  398. void InitMem (void)
  399. {
  400.     unsigned long i;
  401.  
  402.     for (i = 0; i < 32768; i++)
  403.         modtable[i + 32768] = i % 9999;
  404.     for (i = 32768; i < 65536; i++)
  405.         modtable[i - 32768] = i % 9999;
  406. }
  407.  
  408. int main (int argc, char *argv[])
  409. {
  410.     struct IntuiMessage *IMsg;
  411.  
  412.     if (argc == 2)
  413.         DebugFlag = strcmp ("-d", argv[1]) ? FALSE : TRUE;
  414.  
  415.     if (!(IntuitionBase = OpenLibrary ((unsigned char *)"intuition.library",
  416.         37L)))
  417.         puts ("Ich benötige die Intuition-Library >= V37.");
  418.     else {
  419.         if (!(GadToolsBase = OpenLibrary ((unsigned char *)"gadtools.library",
  420.             37L)))
  421.             puts ("Ich benötige die Gadtools-Library >= V37.");
  422.         else {
  423.             if (!(AslBase = OpenLibrary ((unsigned char *)"asl.library", 37L)))
  424.                 puts ("Ich benötige die Asl-Library >= V37.");
  425.             else {
  426.                 if (!(FileReq = (struct FileRequester *)
  427.                     AllocAslRequest (ASL_FileRequest, NoTags)))
  428.                     puts ("Ich kann den Filerequester nicht allozieren.");
  429.                 else {
  430.                     if (!(modtable = AllocMem (65536, MEMF_PUBLIC)))
  431.                         puts ("Ich kann keine 64 KByte allozieren.");
  432.                     else {
  433.                         InitMem ();
  434.                         if (!ReadDefaults ())
  435.                             puts ("Ich kann 'dodec.def' nicht einlesen.");
  436.                         else {
  437.                             if (!CreateWindow ())
  438.                                 puts ("Ich kann das Programmfenster nicht öffnen.");
  439.                             else {
  440.                                 short ExitHere = FALSE;
  441.                                 SetStat ("Bereit.");
  442.                                 do {
  443.                                     WaitPort (Win -> UserPort);
  444.                                     IMsg = GT_GetIMsg (Win -> UserPort);
  445.                                     if (IMsg) {
  446.                                         ExitHere = HandleIMsg (IMsg);
  447.                                         GT_ReplyIMsg (IMsg);
  448.                                     } else
  449.                                         continue;
  450.                                 } while (!ExitHere);
  451.                                 DeleteWindow ();
  452.                             }
  453.                             FreeDefaults ();
  454.                         }
  455.                         FreeMem (modtable, 65536);
  456.                     }
  457.                     FreeAslRequest (FileReq);
  458.                 }
  459.                 CloseLibrary (AslBase);
  460.             }
  461.             CloseLibrary (GadToolsBase);
  462.         }
  463.         CloseLibrary (IntuitionBase);
  464.     }
  465.     return 0;
  466. }
  467.